{
&sort,
"sort",
- "Rearrange waypoints by resorting",
+ "Rearrange waypoints, routes and/or tracks by resorting",
},
{
&stackfilt,
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="25.600000000" minlon="-112.900000000" maxlat="48.858370100" maxlon="2.292292600"/>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.250Z</time>
+ <name>b</name>
+ <cmt>a</cmt>
+ <desc>a</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.750Z</time>
+ <name>a</name>
+ <cmt>b</cmt>
+ <desc>b</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-07T05:04:03.750Z</time>
+ <name>d</name>
+ <cmt>c</cmt>
+ <desc>c</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-05T05:04:03.750Z</time>
+ <name>c</name>
+ <cmt>d</cmt>
+ <desc>d</desc>
+ </wpt>
+ <rte>
+ <name>b</name>
+ <desc>c</desc>
+ <number>11163</number>
+ <rtept lat="47.600000000" lon="-89.900000000">
+ <name>RPT001</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>a</name>
+ <desc>b</desc>
+ <number>15939</number>
+ <rtept lat="47.700000000" lon="-89.800000000">
+ <name>RPT002</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>c</name>
+ <desc>a</desc>
+ <number>10607</number>
+ <rtept lat="47.800000000" lon="-89.700000000">
+ <name>RPT003</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>d</name>
+ <desc>d</desc>
+ <number>24282</number>
+ <rtept lat="47.900000000" lon="-89.600000000">
+ <name>RPT004</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>d</name>
+ <desc>b</desc>
+ <number>31163</number>
+ <trkseg>
+ <trkpt lat="25.600000000" lon="-112.900000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>b</name>
+ <desc>d</desc>
+ <number>15939</number>
+ <trkseg>
+ <trkpt lat="25.700000000" lon="-112.800000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>a</name>
+ <desc>a</desc>
+ <number>607</number>
+ <trkseg>
+ <trkpt lat="25.800000000" lon="-112.700000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>c</name>
+ <desc>c</desc>
+ <number>24282</number>
+ <trkseg>
+ <trkpt lat="25.900000000" lon="-112.600000000"/>
+ </trkseg>
+ </trk>
+</gpx>
<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="tsteven4" xmlns="http://www.topografix.com/GPX/1/0">
- <wpt lat="48.8583701" lon="2.2922926">
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="25.600000000" minlon="-112.900000000" maxlat="48.858370100" maxlon="2.292292600"/>
+ <wpt lat="48.858370100" lon="2.292292600">
<time>2018-07-06T05:04:03.750Z</time>
+ <name>a</name>
+ <cmt>b</cmt>
+ <desc>b</desc>
</wpt>
- <wpt lat="48.8583701" lon="2.2922926">
+ <wpt lat="48.858370100" lon="2.292292600">
<time>2018-07-06T05:04:03.250Z</time>
+ <name>b</name>
+ <cmt>a</cmt>
+ <desc>a</desc>
</wpt>
- <wpt lat="48.8583701" lon="2.2922926">
+ <wpt lat="48.858370100" lon="2.292292600">
<time>2018-07-07T05:04:03.750Z</time>
+ <name>d</name>
+ <cmt>c</cmt>
+ <desc>c</desc>
</wpt>
- <wpt lat="48.8583701" lon="2.2922926">
+ <wpt lat="48.858370100" lon="2.292292600">
<time>2018-07-05T05:04:03.750Z</time>
+ <name>c</name>
+ <cmt>d</cmt>
+ <desc>d</desc>
</wpt>
+ <rte>
+ <name>b</name>
+ <desc>c</desc>
+ <number>11163</number>
+ <rtept lat="47.600000000" lon="-89.900000000">
+ <name>RPT001</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>a</name>
+ <desc>b</desc>
+ <number>15939</number>
+ <rtept lat="47.700000000" lon="-89.800000000">
+ <name>RPT002</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>c</name>
+ <desc>a</desc>
+ <number>10607</number>
+ <rtept lat="47.800000000" lon="-89.700000000">
+ <name>RPT003</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>d</name>
+ <desc>d</desc>
+ <number>24282</number>
+ <rtept lat="47.900000000" lon="-89.600000000">
+ <name>RPT004</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>d</name>
+ <desc>b</desc>
+ <number>31163</number>
+ <trkseg>
+ <trkpt lat="25.600000000" lon="-112.900000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>b</name>
+ <desc>d</desc>
+ <number>15939</number>
+ <trkseg>
+ <trkpt lat="25.700000000" lon="-112.800000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>a</name>
+ <desc>a</desc>
+ <number>607</number>
+ <trkseg>
+ <trkpt lat="25.800000000" lon="-112.700000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>c</name>
+ <desc>c</desc>
+ <number>24282</number>
+ <trkseg>
+ <trkpt lat="25.900000000" lon="-112.600000000"/>
+ </trkseg>
+ </trk>
</gpx>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="48.858370100" minlon="2.292292600" maxlat="48.858370100" maxlon="2.292292600"/>
- <wpt lat="48.858370100" lon="2.292292600">
- <time>2018-07-05T05:04:03.750Z</time>
- <name>WPT004</name>
- <cmt>WPT004</cmt>
- <desc>WPT004</desc>
- </wpt>
- <wpt lat="48.858370100" lon="2.292292600">
- <time>2018-07-06T05:04:03.250Z</time>
- <name>WPT002</name>
- <cmt>WPT002</cmt>
- <desc>WPT002</desc>
- </wpt>
- <wpt lat="48.858370100" lon="2.292292600">
- <time>2018-07-06T05:04:03.750Z</time>
- <name>WPT001</name>
- <cmt>WPT001</cmt>
- <desc>WPT001</desc>
- </wpt>
- <wpt lat="48.858370100" lon="2.292292600">
- <time>2018-07-07T05:04:03.750Z</time>
- <name>WPT003</name>
- <cmt>WPT003</cmt>
- <desc>WPT003</desc>
- </wpt>
-</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="25.600000000" minlon="-112.900000000" maxlat="48.858370100" maxlon="2.292292600"/>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.750Z</time>
+ <name>a</name>
+ <cmt>b</cmt>
+ <desc>b</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.250Z</time>
+ <name>b</name>
+ <cmt>a</cmt>
+ <desc>a</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-07T05:04:03.750Z</time>
+ <name>d</name>
+ <cmt>c</cmt>
+ <desc>c</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-05T05:04:03.750Z</time>
+ <name>c</name>
+ <cmt>d</cmt>
+ <desc>d</desc>
+ </wpt>
+ <rte>
+ <name>c</name>
+ <desc>a</desc>
+ <number>10607</number>
+ <rtept lat="47.800000000" lon="-89.700000000">
+ <name>RPT003</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>a</name>
+ <desc>b</desc>
+ <number>15939</number>
+ <rtept lat="47.700000000" lon="-89.800000000">
+ <name>RPT002</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>b</name>
+ <desc>c</desc>
+ <number>11163</number>
+ <rtept lat="47.600000000" lon="-89.900000000">
+ <name>RPT001</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>d</name>
+ <desc>d</desc>
+ <number>24282</number>
+ <rtept lat="47.900000000" lon="-89.600000000">
+ <name>RPT004</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>d</name>
+ <desc>b</desc>
+ <number>31163</number>
+ <trkseg>
+ <trkpt lat="25.600000000" lon="-112.900000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>b</name>
+ <desc>d</desc>
+ <number>15939</number>
+ <trkseg>
+ <trkpt lat="25.700000000" lon="-112.800000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>a</name>
+ <desc>a</desc>
+ <number>607</number>
+ <trkseg>
+ <trkpt lat="25.800000000" lon="-112.700000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>c</name>
+ <desc>c</desc>
+ <number>24282</number>
+ <trkseg>
+ <trkpt lat="25.900000000" lon="-112.600000000"/>
+ </trkseg>
+ </trk>
+</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="25.600000000" minlon="-112.900000000" maxlat="48.858370100" maxlon="2.292292600"/>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.750Z</time>
+ <name>a</name>
+ <cmt>b</cmt>
+ <desc>b</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.250Z</time>
+ <name>b</name>
+ <cmt>a</cmt>
+ <desc>a</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-07T05:04:03.750Z</time>
+ <name>d</name>
+ <cmt>c</cmt>
+ <desc>c</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-05T05:04:03.750Z</time>
+ <name>c</name>
+ <cmt>d</cmt>
+ <desc>d</desc>
+ </wpt>
+ <rte>
+ <name>a</name>
+ <desc>b</desc>
+ <number>15939</number>
+ <rtept lat="47.700000000" lon="-89.800000000">
+ <name>RPT002</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>b</name>
+ <desc>c</desc>
+ <number>11163</number>
+ <rtept lat="47.600000000" lon="-89.900000000">
+ <name>RPT001</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>c</name>
+ <desc>a</desc>
+ <number>10607</number>
+ <rtept lat="47.800000000" lon="-89.700000000">
+ <name>RPT003</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>d</name>
+ <desc>d</desc>
+ <number>24282</number>
+ <rtept lat="47.900000000" lon="-89.600000000">
+ <name>RPT004</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>d</name>
+ <desc>b</desc>
+ <number>31163</number>
+ <trkseg>
+ <trkpt lat="25.600000000" lon="-112.900000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>b</name>
+ <desc>d</desc>
+ <number>15939</number>
+ <trkseg>
+ <trkpt lat="25.700000000" lon="-112.800000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>a</name>
+ <desc>a</desc>
+ <number>607</number>
+ <trkseg>
+ <trkpt lat="25.800000000" lon="-112.700000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>c</name>
+ <desc>c</desc>
+ <number>24282</number>
+ <trkseg>
+ <trkpt lat="25.900000000" lon="-112.600000000"/>
+ </trkseg>
+ </trk>
+</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="25.600000000" minlon="-112.900000000" maxlat="48.858370100" maxlon="2.292292600"/>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.750Z</time>
+ <name>a</name>
+ <cmt>b</cmt>
+ <desc>b</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.250Z</time>
+ <name>b</name>
+ <cmt>a</cmt>
+ <desc>a</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-07T05:04:03.750Z</time>
+ <name>d</name>
+ <cmt>c</cmt>
+ <desc>c</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-05T05:04:03.750Z</time>
+ <name>c</name>
+ <cmt>d</cmt>
+ <desc>d</desc>
+ </wpt>
+ <rte>
+ <name>c</name>
+ <desc>a</desc>
+ <number>10607</number>
+ <rtept lat="47.800000000" lon="-89.700000000">
+ <name>RPT003</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>b</name>
+ <desc>c</desc>
+ <number>11163</number>
+ <rtept lat="47.600000000" lon="-89.900000000">
+ <name>RPT001</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>a</name>
+ <desc>b</desc>
+ <number>15939</number>
+ <rtept lat="47.700000000" lon="-89.800000000">
+ <name>RPT002</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>d</name>
+ <desc>d</desc>
+ <number>24282</number>
+ <rtept lat="47.900000000" lon="-89.600000000">
+ <name>RPT004</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>d</name>
+ <desc>b</desc>
+ <number>31163</number>
+ <trkseg>
+ <trkpt lat="25.600000000" lon="-112.900000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>b</name>
+ <desc>d</desc>
+ <number>15939</number>
+ <trkseg>
+ <trkpt lat="25.700000000" lon="-112.800000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>a</name>
+ <desc>a</desc>
+ <number>607</number>
+ <trkseg>
+ <trkpt lat="25.800000000" lon="-112.700000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>c</name>
+ <desc>c</desc>
+ <number>24282</number>
+ <trkseg>
+ <trkpt lat="25.900000000" lon="-112.600000000"/>
+ </trkseg>
+ </trk>
+</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="25.600000000" minlon="-112.900000000" maxlat="48.858370100" maxlon="2.292292600"/>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.750Z</time>
+ <name>a</name>
+ <cmt>b</cmt>
+ <desc>b</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.250Z</time>
+ <name>b</name>
+ <cmt>a</cmt>
+ <desc>a</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-05T05:04:03.750Z</time>
+ <name>c</name>
+ <cmt>d</cmt>
+ <desc>d</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-07T05:04:03.750Z</time>
+ <name>d</name>
+ <cmt>c</cmt>
+ <desc>c</desc>
+ </wpt>
+ <rte>
+ <name>b</name>
+ <desc>c</desc>
+ <number>11163</number>
+ <rtept lat="47.600000000" lon="-89.900000000">
+ <name>RPT001</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>a</name>
+ <desc>b</desc>
+ <number>15939</number>
+ <rtept lat="47.700000000" lon="-89.800000000">
+ <name>RPT002</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>c</name>
+ <desc>a</desc>
+ <number>10607</number>
+ <rtept lat="47.800000000" lon="-89.700000000">
+ <name>RPT003</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>d</name>
+ <desc>d</desc>
+ <number>24282</number>
+ <rtept lat="47.900000000" lon="-89.600000000">
+ <name>RPT004</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>d</name>
+ <desc>b</desc>
+ <number>31163</number>
+ <trkseg>
+ <trkpt lat="25.600000000" lon="-112.900000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>b</name>
+ <desc>d</desc>
+ <number>15939</number>
+ <trkseg>
+ <trkpt lat="25.700000000" lon="-112.800000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>a</name>
+ <desc>a</desc>
+ <number>607</number>
+ <trkseg>
+ <trkpt lat="25.800000000" lon="-112.700000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>c</name>
+ <desc>c</desc>
+ <number>24282</number>
+ <trkseg>
+ <trkpt lat="25.900000000" lon="-112.600000000"/>
+ </trkseg>
+ </trk>
+</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="25.600000000" minlon="-112.900000000" maxlat="48.858370100" maxlon="2.292292600"/>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-05T05:04:03.750Z</time>
+ <name>c</name>
+ <cmt>d</cmt>
+ <desc>d</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.250Z</time>
+ <name>b</name>
+ <cmt>a</cmt>
+ <desc>a</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.750Z</time>
+ <name>a</name>
+ <cmt>b</cmt>
+ <desc>b</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-07T05:04:03.750Z</time>
+ <name>d</name>
+ <cmt>c</cmt>
+ <desc>c</desc>
+ </wpt>
+ <rte>
+ <name>b</name>
+ <desc>c</desc>
+ <number>11163</number>
+ <rtept lat="47.600000000" lon="-89.900000000">
+ <name>RPT001</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>a</name>
+ <desc>b</desc>
+ <number>15939</number>
+ <rtept lat="47.700000000" lon="-89.800000000">
+ <name>RPT002</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>c</name>
+ <desc>a</desc>
+ <number>10607</number>
+ <rtept lat="47.800000000" lon="-89.700000000">
+ <name>RPT003</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>d</name>
+ <desc>d</desc>
+ <number>24282</number>
+ <rtept lat="47.900000000" lon="-89.600000000">
+ <name>RPT004</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>d</name>
+ <desc>b</desc>
+ <number>31163</number>
+ <trkseg>
+ <trkpt lat="25.600000000" lon="-112.900000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>b</name>
+ <desc>d</desc>
+ <number>15939</number>
+ <trkseg>
+ <trkpt lat="25.700000000" lon="-112.800000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>a</name>
+ <desc>a</desc>
+ <number>607</number>
+ <trkseg>
+ <trkpt lat="25.800000000" lon="-112.700000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>c</name>
+ <desc>c</desc>
+ <number>24282</number>
+ <trkseg>
+ <trkpt lat="25.900000000" lon="-112.600000000"/>
+ </trkseg>
+ </trk>
+</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="25.600000000" minlon="-112.900000000" maxlat="48.858370100" maxlon="2.292292600"/>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.750Z</time>
+ <name>a</name>
+ <cmt>b</cmt>
+ <desc>b</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.250Z</time>
+ <name>b</name>
+ <cmt>a</cmt>
+ <desc>a</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-07T05:04:03.750Z</time>
+ <name>d</name>
+ <cmt>c</cmt>
+ <desc>c</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-05T05:04:03.750Z</time>
+ <name>c</name>
+ <cmt>d</cmt>
+ <desc>d</desc>
+ </wpt>
+ <rte>
+ <name>b</name>
+ <desc>c</desc>
+ <number>11163</number>
+ <rtept lat="47.600000000" lon="-89.900000000">
+ <name>RPT001</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>a</name>
+ <desc>b</desc>
+ <number>15939</number>
+ <rtept lat="47.700000000" lon="-89.800000000">
+ <name>RPT002</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>c</name>
+ <desc>a</desc>
+ <number>10607</number>
+ <rtept lat="47.800000000" lon="-89.700000000">
+ <name>RPT003</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>d</name>
+ <desc>d</desc>
+ <number>24282</number>
+ <rtept lat="47.900000000" lon="-89.600000000">
+ <name>RPT004</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>a</name>
+ <desc>a</desc>
+ <number>607</number>
+ <trkseg>
+ <trkpt lat="25.800000000" lon="-112.700000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>d</name>
+ <desc>b</desc>
+ <number>31163</number>
+ <trkseg>
+ <trkpt lat="25.600000000" lon="-112.900000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>c</name>
+ <desc>c</desc>
+ <number>24282</number>
+ <trkseg>
+ <trkpt lat="25.900000000" lon="-112.600000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>b</name>
+ <desc>d</desc>
+ <number>15939</number>
+ <trkseg>
+ <trkpt lat="25.700000000" lon="-112.800000000"/>
+ </trkseg>
+ </trk>
+</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="25.600000000" minlon="-112.900000000" maxlat="48.858370100" maxlon="2.292292600"/>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.750Z</time>
+ <name>a</name>
+ <cmt>b</cmt>
+ <desc>b</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.250Z</time>
+ <name>b</name>
+ <cmt>a</cmt>
+ <desc>a</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-07T05:04:03.750Z</time>
+ <name>d</name>
+ <cmt>c</cmt>
+ <desc>c</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-05T05:04:03.750Z</time>
+ <name>c</name>
+ <cmt>d</cmt>
+ <desc>d</desc>
+ </wpt>
+ <rte>
+ <name>b</name>
+ <desc>c</desc>
+ <number>11163</number>
+ <rtept lat="47.600000000" lon="-89.900000000">
+ <name>RPT001</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>a</name>
+ <desc>b</desc>
+ <number>15939</number>
+ <rtept lat="47.700000000" lon="-89.800000000">
+ <name>RPT002</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>c</name>
+ <desc>a</desc>
+ <number>10607</number>
+ <rtept lat="47.800000000" lon="-89.700000000">
+ <name>RPT003</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>d</name>
+ <desc>d</desc>
+ <number>24282</number>
+ <rtept lat="47.900000000" lon="-89.600000000">
+ <name>RPT004</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>a</name>
+ <desc>a</desc>
+ <number>607</number>
+ <trkseg>
+ <trkpt lat="25.800000000" lon="-112.700000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>b</name>
+ <desc>d</desc>
+ <number>15939</number>
+ <trkseg>
+ <trkpt lat="25.700000000" lon="-112.800000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>c</name>
+ <desc>c</desc>
+ <number>24282</number>
+ <trkseg>
+ <trkpt lat="25.900000000" lon="-112.600000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>d</name>
+ <desc>b</desc>
+ <number>31163</number>
+ <trkseg>
+ <trkpt lat="25.600000000" lon="-112.900000000"/>
+ </trkseg>
+ </trk>
+</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="25.600000000" minlon="-112.900000000" maxlat="48.858370100" maxlon="2.292292600"/>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.750Z</time>
+ <name>a</name>
+ <cmt>b</cmt>
+ <desc>b</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-06T05:04:03.250Z</time>
+ <name>b</name>
+ <cmt>a</cmt>
+ <desc>a</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-07T05:04:03.750Z</time>
+ <name>d</name>
+ <cmt>c</cmt>
+ <desc>c</desc>
+ </wpt>
+ <wpt lat="48.858370100" lon="2.292292600">
+ <time>2018-07-05T05:04:03.750Z</time>
+ <name>c</name>
+ <cmt>d</cmt>
+ <desc>d</desc>
+ </wpt>
+ <rte>
+ <name>b</name>
+ <desc>c</desc>
+ <number>11163</number>
+ <rtept lat="47.600000000" lon="-89.900000000">
+ <name>RPT001</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>a</name>
+ <desc>b</desc>
+ <number>15939</number>
+ <rtept lat="47.700000000" lon="-89.800000000">
+ <name>RPT002</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>c</name>
+ <desc>a</desc>
+ <number>10607</number>
+ <rtept lat="47.800000000" lon="-89.700000000">
+ <name>RPT003</name>
+ </rtept>
+ </rte>
+ <rte>
+ <name>d</name>
+ <desc>d</desc>
+ <number>24282</number>
+ <rtept lat="47.900000000" lon="-89.600000000">
+ <name>RPT004</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>a</name>
+ <desc>a</desc>
+ <number>607</number>
+ <trkseg>
+ <trkpt lat="25.800000000" lon="-112.700000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>b</name>
+ <desc>d</desc>
+ <number>15939</number>
+ <trkseg>
+ <trkpt lat="25.700000000" lon="-112.800000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>c</name>
+ <desc>c</desc>
+ <number>24282</number>
+ <trkseg>
+ <trkpt lat="25.900000000" lon="-112.600000000"/>
+ </trkseg>
+ </trk>
+ <trk>
+ <name>d</name>
+ <desc>b</desc>
+ <number>31163</number>
+ <trkseg>
+ <trkpt lat="25.600000000" lon="-112.900000000"/>
+ </trkseg>
+ </trk>
+</gpx>
#include "defs.h"
#include "filterdefs.h"
#include "sort.h"
-#include <cstdlib>
+#include <QtCore/QString> // for QString
+#include <cstdlib> // for abort
+
+extern queue my_route_head;
+extern queue my_track_head;
#if FILTERS_ENABLED
template <class T>
-inline int sgn(T v) {
+inline int sgn(T v)
+{
// Returns 1 if v > 0, -1 if v < 0, and 0 if v is zero
return (v > T(0)) - (v < T(0));
}
-int SortFilter::sort_comp(const queue* a, const queue* b)
+template <class T>
+inline int cmp(T a, T b)
{
- const Waypoint* x1 = reinterpret_cast<const Waypoint *>(a);
- const Waypoint* x2 = reinterpret_cast<const Waypoint *>(b);
+// Returns 1 if a > b, -1 if a < b, and 0 if a = b
+// note possible overflow in computing sgn(a-b) is avoided.
+ return (a > b) - (a < b);
+}
- switch (sort_mode) {
- case sm_gcid:
- return x1->gc_data->id - x2->gc_data->id;
- case sm_shortname:
- return x1->shortname.compare(x2->shortname);
- case sm_description:
+int SortFilter::sort_comp_wpt(const queue* a, const queue* b)
+{
+ const Waypoint* x1 = reinterpret_cast<const Waypoint*>(a);
+ const Waypoint* x2 = reinterpret_cast<const Waypoint*>(b);
+
+ switch (wpt_sort_mode) {
+ case SortModeWpt::description:
return x1->description.compare(x2->description);
- case sm_time:
+ case SortModeWpt::gcid:
+ return cmp(x1->gc_data->id, x2->gc_data->id);
+ case SortModeWpt::shortname:
+ return x1->shortname.compare(x2->shortname);
+ case SortModeWpt::time:
return sgn(x2->GetCreationTime().msecsTo(x1->GetCreationTime()));
default:
abort();
}
}
-int SortFilter::SortCompFunctor::operator()(const queue* a, const queue* b)
+int SortFilter::sort_comp_rh(const queue* a, const queue* b)
+{
+ const route_head* x1 = reinterpret_cast<const route_head*>(a);
+ const route_head* x2 = reinterpret_cast<const route_head*>(b);
+
+ switch (rh_sort_mode) {
+ case SortModeRteHd::description:
+ return x1->rte_desc.compare(x2->rte_desc);
+ case SortModeRteHd::name:
+ return x1->rte_name.compare(x2->rte_name);
+ case SortModeRteHd::number:
+ return cmp(x1->rte_num, x2->rte_num);
+ default:
+ abort();
+ return 0; /* Internal caller error. */
+ }
+}
+
+int SortFilter::SortCompWptFunctor::operator()(const queue* a, const queue* b)
+{
+ return that->sort_comp_wpt(a, b);
+}
+
+int SortFilter::SortCompRteHdFunctor::operator()(const queue* a, const queue* b)
{
- return that->sort_comp(a, b);
+ return that->sort_comp_rh(a, b);
}
void SortFilter::process()
{
- SortCompFunctor sort_comp(*this);
+ SortCompWptFunctor sort_comp_wpt_f(*this);
+ SortCompRteHdFunctor sort_comp_rh_f(*this);
- sortqueue(&waypt_head, sort_comp);
+ if (wpt_sort_mode != SortModeWpt::none) {
+ sortqueue(&waypt_head, sort_comp_wpt_f);
+ }
+ if (rte_sort_mode != SortModeRteHd::none) {
+ rh_sort_mode = rte_sort_mode;
+ sortqueue(&my_route_head, sort_comp_rh_f);
+ }
+ if (trk_sort_mode != SortModeRteHd::none) {
+ rh_sort_mode = trk_sort_mode;
+ sortqueue(&my_track_head, sort_comp_rh_f);
+ }
}
void SortFilter::init()
{
+ // sort waypts by
+ if (opt_sm_description) {
+ wpt_sort_mode = SortModeWpt::description;
+ }
if (opt_sm_gcid) {
- sort_mode = sm_gcid;
+ wpt_sort_mode = SortModeWpt::gcid;
}
if (opt_sm_shortname) {
- sort_mode = sm_shortname;
- }
- if (opt_sm_description) {
- sort_mode = sm_description;
+ wpt_sort_mode = SortModeWpt::shortname;
}
if (opt_sm_time) {
- sort_mode = sm_time;
+ wpt_sort_mode = SortModeWpt::time;
+ }
+
+ // sort routes by
+ if (opt_sm_rtedesc) {
+ rte_sort_mode = SortModeRteHd::description;
+ }
+ if (opt_sm_rtename) {
+ rte_sort_mode = SortModeRteHd::name;
+ }
+ if (opt_sm_rtenum) {
+ rte_sort_mode = SortModeRteHd::number;
+ }
+
+ // sort tracks by
+ if (opt_sm_trkdesc) {
+ trk_sort_mode = SortModeRteHd::description;
+ }
+ if (opt_sm_trkname) {
+ trk_sort_mode = SortModeRteHd::name;
+ }
+ if (opt_sm_trknum) {
+ trk_sort_mode = SortModeRteHd::number;
}
}
void process() override;
private:
- typedef enum {
- sm_unknown = 0,
- sm_gcid,
- sm_shortname,
- sm_description,
- sm_time
- } sort_mode_;
+ enum class SortModeWpt {
+ none,
+ description,
+ gcid,
+ shortname,
+ time
+ };
+
+ SortModeWpt wpt_sort_mode = SortModeWpt::none; /* How are we sorting these? */
+
+ enum class SortModeRteHd {
+ none,
+ description,
+ name,
+ number
+ };
- sort_mode_ sort_mode = sm_shortname; /* How are we sorting these? */
+ SortModeRteHd rte_sort_mode = SortModeRteHd::none; /* How are we sorting these? */
+ SortModeRteHd trk_sort_mode = SortModeRteHd::none; /* How are we sorting these? */
+ SortModeRteHd rh_sort_mode = SortModeRteHd::none;
char* opt_sm_gcid, *opt_sm_shortname, *opt_sm_description, *opt_sm_time;
+ char* opt_sm_rtenum, *opt_sm_rtename, *opt_sm_rtedesc;
+ char* opt_sm_trknum, *opt_sm_trkname, *opt_sm_trkdesc;
- arglist_t args[5] = {
+ arglist_t args[11] = {
{
- "gcid", &opt_sm_gcid, "Sort by numeric geocache ID",
+ "description", &opt_sm_description, "Sort waypoints by description",
nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
},
{
- "shortname", &opt_sm_shortname, "Sort by waypoint short name",
+ "gcid", &opt_sm_gcid, "Sort waypoints by numeric geocache ID",
+ nullptr, ARGTYPE_BEGIN_EXCL | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+ {
+ "shortname", &opt_sm_shortname, "Sort waypoints by short name",
nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
},
{
- "description", &opt_sm_description, "Sort by waypoint description",
+ "time", &opt_sm_time, "Sort waypoints by time",
+ nullptr, ARGTYPE_END_EXCL | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+ {
+ "rtedesc", &opt_sm_rtedesc, "Sort routes by description",
+ nullptr, ARGTYPE_END_EXCL | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+ {
+ "rtename", &opt_sm_rtename, "Sort routes by name",
nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
},
{
- "time", &opt_sm_time, "Sort by time",
+ "rtenum", &opt_sm_rtenum, "Sort routes by number",
+ nullptr, ARGTYPE_BEGIN_EXCL | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+ {
+ "trkdesc", &opt_sm_trkdesc, "Sort tracks by description",
+ nullptr, ARGTYPE_END_EXCL | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+ {
+ "trkname", &opt_sm_trkname, "Sort tracks by name",
nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
},
+ {
+ "trknum", &opt_sm_trknum, "Sort tracks by number",
+ nullptr, ARGTYPE_BEGIN_EXCL | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
ARG_TERMINATOR
};
- int sort_comp(const queue* a, const queue* b);
+ int sort_comp_wpt(const queue* a, const queue* b);
+ int sort_comp_rh(const queue* a, const queue* b);
+
+ class SortCompWptFunctor
+ {
+ public:
+ SortCompWptFunctor(SortFilter& obj) : that(&obj) {}
+ int operator()(const queue* a, const queue* b);
+
+ private:
+ SortFilter* that;
+ };
- class SortCompFunctor
+ class SortCompRteHdFunctor
{
public:
- SortCompFunctor(SortFilter& obj) : that(&obj) {}
+ SortCompRteHdFunctor(SortFilter& obj) : that(&obj) {}
int operator()(const queue* a, const queue* b);
private:
rm -f ${TMPDIR}/sortfilter*
-gpsbabel -i gpx -f ${REFERENCE}/sortfilter_in.gpx -x sort,time -o gpx -F ${TMPDIR}/sortfilter_out.gpx
-compare ${REFERENCE}/sortfilter_out.gpx ${TMPDIR}/sortfilter_out.gpx
+gpsbabel -i gpx -f ${REFERENCE}/sortfilter_in.gpx -x sort,time -o gpx -F ${TMPDIR}/sortfilter_time_out.gpx
+compare ${REFERENCE}/sortfilter_time_out.gpx ${TMPDIR}/sortfilter_time_out.gpx
+gpsbabel -i gpx -f ${REFERENCE}/sortfilter_in.gpx -x sort,shortname -o gpx -F ${TMPDIR}/sortfilter_shortname_out.gpx
+compare ${REFERENCE}/sortfilter_shortname_out.gpx ${TMPDIR}/sortfilter_shortname_out.gpx
+
+gpsbabel -i gpx -f ${REFERENCE}/sortfilter_in.gpx -x sort,description -o gpx -F ${TMPDIR}/sortfilter_description_out.gpx
+compare ${REFERENCE}/sortfilter_description_out.gpx ${TMPDIR}/sortfilter_description_out.gpx
+
+gpsbabel -i gpx -f ${REFERENCE}/sortfilter_in.gpx -x sort,rtenum -o gpx -F ${TMPDIR}/sortfilter_rtenum_out.gpx
+compare ${REFERENCE}/sortfilter_rtenum_out.gpx ${TMPDIR}/sortfilter_rtenum_out.gpx
+
+gpsbabel -i gpx -f ${REFERENCE}/sortfilter_in.gpx -x sort,rtename -o gpx -F ${TMPDIR}/sortfilter_rtename_out.gpx
+compare ${REFERENCE}/sortfilter_rtename_out.gpx ${TMPDIR}/sortfilter_rtename_out.gpx
+
+gpsbabel -i gpx -f ${REFERENCE}/sortfilter_in.gpx -x sort,rtedesc -o gpx -F ${TMPDIR}/sortfilter_rtedesc_out.gpx
+compare ${REFERENCE}/sortfilter_rtedesc_out.gpx ${TMPDIR}/sortfilter_rtedesc_out.gpx
+
+gpsbabel -i gpx -f ${REFERENCE}/sortfilter_in.gpx -x sort,trknum -o gpx -F ${TMPDIR}/sortfilter_trknum_out.gpx
+compare ${REFERENCE}/sortfilter_trknum_out.gpx ${TMPDIR}/sortfilter_trknum_out.gpx
+
+gpsbabel -i gpx -f ${REFERENCE}/sortfilter_in.gpx -x sort,trkname -o gpx -F ${TMPDIR}/sortfilter_trkname_out.gpx
+compare ${REFERENCE}/sortfilter_trkname_out.gpx ${TMPDIR}/sortfilter_trkname_out.gpx
+
+gpsbabel -i gpx -f ${REFERENCE}/sortfilter_in.gpx -x sort,trkdesc -o gpx -F ${TMPDIR}/sortfilter_trkdesc_out.gpx
+compare ${REFERENCE}/sortfilter_trkdesc_out.gpx ${TMPDIR}/sortfilter_trkdesc_out.gpx
<para>
-This option causes the waypoints to be sorted in alphabetical order by
+This option causes the waypoints to be sorted in alphabetical order by
description.
</para>
<para>
-This option is not valid in combination with any other option.
+This option is not valid in combination with gcid, shortname, and time.
</para>
-
<para>
-If the data contains Groundspeak geocache IDs, this option causes the
-waypoints to be sorted in alphabetical order by geocache ID.
+If the data contains Groundspeak geocache IDs, this option causes the
+waypoints to be sorted in numerical order by geocache ID.
</para>
<para>
-This option is not valid in combination with any other option.
+This option is not valid in combination with description, shortname, and time.
</para>
-
--- /dev/null
+<para>
+This option causes the routes to be sorted in alphabetical order by
+description.
+</para>
+<para>
+This option is not valid in combination with rtename and rtenum.
+</para>
--- /dev/null
+<para>
+This option causes the routes to be sorted in alphabetical order by
+name.
+</para>
+<para>
+This option is not valid in combination with rtedesc and rtenum.
+</para>
--- /dev/null
+<para>
+This option causes the routes to be sorted in numerical order by
+number.
+</para>
+<para>
+This option is not valid in combination with rtedesc and rtename.
+</para>
<para>
-This option causes the waypoints to be sorted in alphabetical order by
+This option causes the waypoints to be sorted in alphabetical order by
short name.
</para>
<para>
-This option is not valid in combination with any other option.
+This option is not valid in combination with description, gcid, and time.
</para>
-
<para>
-This option causes the waypoints to be sorted in chronological order by
+This option causes the waypoints to be sorted in chronological order by
creation time.
</para>
<para>
-This option is not valid in combination with any other option.
+This option is not valid in combination with description, gcid, and shortname.
</para>
-
--- /dev/null
+<para>
+This option causes the tracks to be sorted in alphabetical order by
+description.
+</para>
+<para>
+This option is not valid in combination with trkname and trknum.
+</para>
--- /dev/null
+<para>
+This option causes the tracks to be sorted in alphabetical order by
+name.
+</para>
+<para>
+This option is not valid in combination with trkdesc and trknum.
+</para>
--- /dev/null
+<para>
+This option causes the tracks to be sorted in numerical order by
+number.
+</para>
+<para>
+This option is not valid in combination with trkdesc and trkname.
+</para>
<para>
-This filter sorts waypoints into alphabetical order by the selected field.
-You must specify exactly one of the options.
+This filter sorts waypoints, routes and/or tracks by the selected field(s).
</para>